perm filename TENDMP.MAC[SS,SYS] blob
sn#259797 filedate 1977-01-19 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00009 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE TENDMP - DECTAPE UTILITY
C00004 00003 REGISTER AND PARAMETER ASSIGNMENTS
C00007 00004 INITIAL ENTRY IS AT BEGR, UNLESS A COMMAND POINTER IS
C00010 00005 HERE ON JUMP BLOCK DURING LOADS, OR NUMBER>7 ALT
C00012 00006 ALTTST: TLNN B,4040 IF ALPHA CHARACTERS, DONT GET CH
C00022 00007 RBLK SEARCHES FOR THE BLOCK IN BLKNO, ENTERS IT GOING FORWARD,
C00027 00008 ALTMD: MOVEI A,"$"
C00032 00009 FDIR: MOVNI FILN,26 26 FILES (OCTAL)
C00036 ENDMK
C⊗;
TITLE TENDMP - DECTAPE UTILITY
SUBTTL 551/136 VERSION
; R CLEMENTS/GBH/RH/RD/RCC/JEF 6 APR 71 - V032
; REG 12/5/73
; NOTE THAT THIS CAN ONLY BE ASSEMBLED IN MACRO SINCE FAIL LACKS RIM10B
; OUTPUT, SINCE FAIL NEEDS FIXUPS THAT CAN ONLY BE MADE IN 2 PASSES
COMMENT ⊗
The following is a summary of TENDMP commands. $ means altmode.
n$ n is octal. if n≤7, select DTAn as the current device.
If n>7, set the current starting address to n.
Z$ Zero the directory of the current dectape.
D$file ext Dump nonzero areas of core, and the current starting
address, to the dectape using the given name.
file ext Clear core, load the named file from the dectape and
start it.
L$file ext Clear core and load the named file from the dectape.
M$file ext Load the named file from the dectape
G$ Jump to the current starting address
K$file ext Delete (kill) the named file.
F$ List the dectape directory.
rubout Restart TENDMP
The starting address of 128K TENDMP is 377400
⊗
; REGISTER AND PARAMETER ASSIGNMENTS
IFNDEF REL,<REL=0> ;0 PAPER TAPE, 1 RELOCATABLE BINARY
REL==1
KL10==0
KASIM==1
IFNDEF KL10,<KL10==1> ;ASSEMBLE FOR KL10 TOO.
CORE==40 ;AT STANFORD WE HAVE AT LEAST 128K
;NUMBER OF 8K BLOCKS
IFE REL,<
RIM10B ;RIM10B FOR DECTAPES
>
IFN KASIM,<
REL==0
CORE==10
>
APR=0
UTC=210 ;DEFINE DEVICE NAMES
UTS=214
IFE KL10,<DC==200>
IFN KASIM,<DC==204>
IFN KL10,< DC==204
DTE==200
CCA==14
KLPAG==10
SWEEPB==200000 ;SWEEP BUSY IN KL10 APR CONI.
DONG11==20000 ;RING 11'S DOORBELL
DTFLG==444 ;DTE20 OPERATION COMPLETE FLAG IN EPT
DTF11==450 ; 10 FROM 11 ARGUMENT
DTCMD==451 ; TO 11 COMMAND WORD
>;IFN KL10
F=0 ;MUST BE 0. USED BY JRA'S
B=1 ;TEMP. HOLDS BLOCK # COMPUTATION IN SEARCH
A=2 ;MISC TEMP. HOLDS 136 CONO INDEX IN UWAIT
C=3 ;HOLDS BITS FOR DECTAPE CONO DURING I/O
D=4 ;HOLDS POINTERS FOR AOBJN'S THROUGH CORE
E=5 ;HOLDS COUNT OF WORDS IN CURRENT DT BLOCK
P=6 ;PC FOR JSP'S
CKS=7 ;HAD BEEN CHECKSUM IN MACDMP
FILN=10 ;FILE INDEX IN DIRECTORY, 1 TO 26 OCTAL
BLKNO=11 ;BLOCK NUMBER SEARCHED FOR ON TAPE
WRITE=12 ;MULTI-STATE FLAG - DEFINES I/O OPERATION
;1=D, 0=K, -1=ELSE
PNTR=13 ;POINTER TO BYTE TABLE IN DIRECTORY
CH=14 ;HOLDS 6BIT CHARACTER OF COMMAND, OR -1
Q=15 ;ANOTHER JSP AC
G=16 ;RARELY USED VERY TEMP
CT=17 ;COUNT OF WORDS TO DUMP
COMPTR=BEGR+377 ;COMMAND POINTER, IF SUPPLIED
LOZAD=BEGR-203 ;CORE IS CLEARED FROM 40 THRU LOZAD
LOW=20 ;FIRST LOCATION CONSIDERED FOR DUMPING
HIGH=BEGR-203 ;LAST LOCATION CONSIDERED FOR DUMPING
;ZEROED AT BEG THESE DAYS
FOOF=BEGR-202 ;NEEDED FOR ZERO CORE SEARCH, ZEROED AT BEG1
TAB=BEGR-201 ;FILE DIRECTORY
LINK=BEGR-1 ;0-17=LINK, 18-27=FBN, 29-35=WC
IFE REL,<LOC 17400+<<CORE-1>*20000>>
;INITIAL ENTRY IS AT BEGR, UNLESS A COMMAND POINTER IS
;SUPPLIED IN COMPTR. IN THAT CASE, ENTRY IS AT BEGR+1
BEGR: SETZM COMPTR ;CLEAR ANY JUNK IN COMMAND POINTER
CONO APR,635550 ;I/O RESET, ETC.
BEG: JSP P,CRR ;TYPE A CR-LF
MOVEI D,SPNT-2 ;PREPARE TO REMOVE AOBJN POINTERS
BEG1: SETZB A,FOOF ;CLEAR A TO PUT IN CORE, CLEAR
;FOOF FOR THE NEXT ZERO CORE SEARCH
EXCH A,2(D) ;REMOVE HEADER LIST
AOBJN A,. ;COUNT THROUGH TO NEXT HEADER
MOVEI D,-1(A) ;ACCOUNT FOR OVERSHOOT IN AOBJN
JUMPN D,BEG1 ;IF WE DIDNT AOBJN A 0, GO FOR NEXT HDR
MOVE PNTR,[XWD 500,TAB-1] ;5 BIT BYTES IN DIRECTORY
SETZB CH,F
CRCH: SETOI WRITE,215 ;USED FOR CARRET TYPEOUT
TYI: SETZB C,HIGH ;HOPEFULLY HIGH IS TEMPORARY
SETZB B,E ;NAME INITIALIZING
TLOA B,400000 ;NULL NAME IS "@. "
SPACE: MOVEI E,C-1 ;EXTENSION INTO C
HRLI E,20600 ;FAKE OUT END TEST OF BYTE PTR
CONO UTC,0 ;STOP TAPE DRIVE
;RH OF "NEXT" IS USED AS A CONSTANT
NEXT: ILDB A,@BEGR ;GIVES A 0 UNLESS COMMAND POINTER SUPPLIED
BELL: SETOI FILN,207 ;INITIALIZATION FOR SEARCH
SETZB BLKNO,CT ; "
SETZM LINK
JUMPN A,RCH ;JUMP IF COMMAND READ FROM CORE
CONSO TTY,40 ;TYPEIN FLAG?
JRST .-1 ;NO,WAIT
DATAI TTY,A ;GET TYPED IN CHARACTER
JSP P,TYO ;ECHO IT (WITH PARITY)
RCH: ANDI A,177 ;STRIP OFF PARITY
CAIN A,177 ;RUBOUT?
JRST BEGR ;YES. RESTART TENDMP
CAIE A,33 ;NEW ALTMODE?
CAIL A,175 ;OR 175 OR 176 ALTMODES?
JRST ALTTST ;YES, SOME ALTMODE.
CAIL A,140 ;LOWER CASE CHARACTER?
TRZ A,40 ;YES. CHANGE TO UPPER CASE
SUBI A,40 ;CONVERT TO SIXBIT
JUMPL A,CARRET ;ANY CONTROL CHARACTER
JUMPE A,SPACE ;CHAR WAS 40
TLNE E,770000 ;NO MORE THAN SIX CHARS
IDPB A,E ;GOES INTO AC1 = B
JRST NEXT ;GET ANOTHER CHARACTER
;HERE ON JUMP BLOCK DURING LOADS, OR NUMBER>7 ALT
JBLK: CONO UTC,0 ;STOP TAPE
HRRM D,SADR ;SAVE STARTING ADDRESS
JUMPN CH,BEG ;IF NOT LOADGO COMMAND
SADR: JRST BEG ;CURRENT S.A.
;HERE TO LOAD TAPE TO CORE
LOADS: MOVEI D,LOZAD+1 ;FIRST LOC NOT TO ZERO
SETZM 40 ;A "FEATURE"
MOVE C,[XWD 40,41] ;PREPARE TO CLEAR CORE.
TRNN CH,3 ;SKIP ON M, NOT ON L.
BLT C,-1(D) ;ZERO CORE
;START READING FILE. LODUMP PROCESSES ONE HEADER AND ITS DATA
LOAD: JSP Q,LODUMP
JRST LOAD ;IF OK, GET NEXT BLOCK.
;IF NONE, LODUMP RETURNS TO JBLK.)
DELE: SKIPN E,WRITE ;SKIP IF NOT IN THE K PHASE OF A D COMMAND.
;OR A K COMMAND
;ALSO, SET E =0, SO SEARCH HAPPENS IN RBLK
CLS1: AOJA WRITE,CLSTP ; 0 TO 1. GO DUMP OUT DIRECTORY.
ERR: SKIPA P,NEXT ;SET TO RETURN TO BEGR
CRR: SKIPA A,CRCH ;LIKE HRROI A,215 AND SKIPA
SKIPA A,BELL ;GET A BELL CHARACTER
TYO: SKIPN COMPTR ;DONT TYO IF NO TYI, UNLESS ERR
DATAO TTY,A ;TYPE OUT
CONSZ TTY,20 ;WAIT FOR TTY TO FINISH
JRST .-1 ;NOT YET
CAIE A,215 ;IF CR TYPED IN,
JUMPGE A,(P) ;OR SIGN BIT OF CHAR ON,(SEE CRR)
MOVEI A,12 ;APPEND A LINEFEED
JRST TYO ;GO TYPE LF
ALTTST: TLNN B,4040 ;IF ALPHA CHARACTERS, DONT GET CH
LDB CH,E ;LAST CH BEFORE ALT, -40
JUMPN CH,ALTMD ;IF CH NOT NULL, GOT PROCESS ALTMODE
CARRET: MOVSI FILN,-26 ;FILE NAME SPECIFIED. FIRST THING TO
;DO IS LOOK IT UP IN DIRECTORY
LUP: SKIPN TAB+123(FILN) ;SEARCH FOR FREE FILE
SKIPE BLKNO,TAB+151(FILN) ;CHECK BOTH WORDS
TDZA BLKNO,BLKNO ;ENSURE CLEAR BLOCK NUMBER
HRRM FILN,FREE ;SAVE NUMBER OF A FREE FILE
HLLZ G,TAB+151(FILN) ;ONLY CHECK LEFT OF 2ND WD
CAMN B,TAB+123(FILN) ;SEARCH FOR TYPED-IN FILE
CAME C,G ;BOTH WORDS
AOBJN FILN,LUP ;NOT THIS ONE. KEEP LOOKING
JUMPL FILN,BEG69 ;IF FILE FOUND, JUMP
JUMPLE WRITE,ERR ;IF NOT FOUND, BETTER BE DUMP
FREE: MOVEI FILN,.-. ;DUMP & NOT FOUND, MAKE ENTRY WHERE FREE
;(ADDRESS MODIFIED ABOVE)
SKIPE TAB+123(FILN) ;MAKE SURE HOLE AVAILABLE
JRST ERR ;NO FREE SLOTS
BEG69: MOVEI FILN,1(FILN) ;FILN IS FILE #+1; CLR LH
JUMPL WRITE,LOADS ;ALL LOAD INSTRUCTIONS
SKIPN WRITE ;DELETE? (K COMMAND)
SETZB B,C ;YES, KILL FILE
MOVEM B,TAB+122(FILN) ;CLEAR IF DELE, ENTER IF NEW DUMP
HLLZM C,TAB+150(FILN) ;BOTH WORDS
;FALL INTO DUMP ROUTINE (WHICH IS A NO-OP FOR K)
;DUMP WRITES OUT CORE ONTO TAPE
;DUMP THRU DUMP2-1 SETS UP POINTERS TO NON-ZERO CORE AREAS. THESE
;AOBJN POINTERS ARE CALLED "HEADERS", AND PRECEDE THE DATA WHEN
;THE TAPE IS WRITTEN.
;THE FIRST HEADER IS KEPT IN SPNT. SUCCESIVE HEADERS GO INTO THE FIRST
;ZERO WORD FOLLOWING THE BLOCK CORRESPONDING TO THE PREVIOUS HEADER.
;AFTER THE LAST NON-ZERO BLOCK IS (BY DEFINITION) A ZERO, WHICH
;TERMINATES THE HEADER LIST. THIS WORD MAY BE LOCATION FOOF (37176) IF
;CORE WAS FILLED UP TO THE BASE OF TENDMP.
DUMP: ;HERE ON D,K. (BLKN)=0, FILN SET UP
MOVN A,[XWD HIGH-LOW-1,-LOW+1] ;COUNTER TO EXAMINE CORE FOR BLOCKS OF 0
MOVEI CKS,SPNT-1 ;FIRST HEADER GOES INTO SPNT
DMP1: SKIPN 1(A) ;FIND SOME NON-ZERO CORE
AOBJN A,.-1 ;ZERO. KEEP LOOKING.
MOVEM A,D ;SAVE ADR
SKIPN 1(A) ;FIND SOME ZERO CORE
SKIPE 2(A) ;DON'T MAKE NEW BLOCK FOR 1 ZERO
AOBJN A,.-2 ;NON-ZERO. KEEP LOOKING
SUB D,A ;GET -COUNT IN BOTH HALVES OF D
SUBI CT,-1(D) ;COUNT N WORDS DATA, 1 HDR
ADDI D,(A) ;GET F.A.-1 IN RH OF D
MOVEM D,1(CKS) ;SAVE HEADER
JUMPGE D,.+2 ;ON DATA GROUPS,
MOVE CKS,A ;GET THE HEADER
;F.A.+W.C. IS ADR OF NEXT HEADER
;I.E., FIRST 0 AFTER NON-ZERO BLOCK
JUMPL A,DMP1 ;LOOP IF MORE CORE
LSH CKS,2 ;SHIFT CORE SIZ FOR DIR
SKIPLE WRITE ;IF DUMPING, SET JOBREL
HRRM CKS,TAB+150(FILN) ;PUT IN DIR
MOVEI D,SPNT-1 ;SET UP TO FOLLOW THE HEADERS.
MOVEI CT,1(CT) ;CLR LH, COUNT JBLK
DMP3: MOVE D,1(D) ;GET HEADER
JUMPGE D,THRU ;IF NULL HEADER FOUND
MOVEI Q,DMP3 ;Q:= DMP3 AS A RETURN AFTER AOBJN
LODUMP: JSP P,UWAIT
JFCL D ;IN/OUTPUT AOBJN POINTER INTO D.
JUMPGE D,JBLK ;IF JRST BLOCK READ. CANT HAPPEN ON WRITE
DMP5: JSP P,UWAIT
JFCL 1(D) ;IN/OUTPUT DATA WORD
AOBJN D,DMP5 ;COUNT DOWN THE HEADER
JRST (Q) ;END OF HEADER. TO DMP3 OR LOAD+1
;WRITE: 1=D 0=K -1=ELSE
THRU: JSP P,UWAIT ;WRITE OUT JRST BLOCK. HERE AT END OF D OR K
JFCL SADR ;FROM LOC SADR
TRZA WRITE,-1 ;THEN SET WRITE TO 0, AND GO CLOBBER
;ANY FURTHER BLOCKS WITH THIS FILN
UWAIT: AOJL E,UWAIT1 ;RETURN ADDR = (P) DATA ADDR = @(P)
;E IS -WD COUNT IN BLOCK OR POSITIVE
;BYTE POINTER FIRST TIME THRU
HLRZ BLKNO,LINK ;SET TO FOLLOW LINK
MNLUP0: JUMPGE WRITE,MNLUP ;WRITING OR DELETING
JUMPN BLKNO,RBLK ;FOR READING WE DON'T ASSIGN BLOCKS
MNLUP: AOSA BLKNO ;NEXT BLOCK IN THE DIRECTORY
MNLUP1: DPB B,PNTR ;FOR DELETE, 0 FILE NAME AND NUMBER
ILDB A,PNTR ;SEARCH FILE DIR
CAIN A,37 ;END OF SLOTS?
JRST DELE ;YES. D COMMADN WILL WRITE DIRECTORY NEXT.
TLO A,-1(WRITE) ;0 ON D, -1 ON K OR K PHASE OF D
CAIE FILN,(A) ;IS THIS BLOCK ASSIGNED TO CURRENT FILE?
JUMPN A,MNLUP ;OR MAYBE FREE? JUMP IF IN USE BY
;ANOTHER FILE.
DPB FILN,PNTR ;SMASH AWAY WRITE BLOCK ON D OR K. BUT
;SEE MNLUP1 ON K.
JUMPE WRITE,MNLUP1 ;K COMMAND
SKIPN C,LINK ;HAS LINK BEEN SET UP?
DPB BLKNO,[XWD 101200,LINK] ;NO. PUT BLOCK IN AS FIRST BLK NO
HRLM BLKNO,LINK ;PUT BLOCK IN AS LINK
JUMPE C,MNLUP0 ;JUMP IF THIS IS THE FIRST PASS THRU DIRECTORY
HLRZ BLKNO,C ;GET LINKED BLOCK CHOSEN BEFORE
MOVEI C,177 ;PUT IN A WORD COUNT FOR PIP
IORM C,LINK ;AND PUT ALL THAT INTO LINK WORD
SUBI CT,177 ;DECREMENT WORDS LEFT TO GO
;FALL INTO RBLK TO POSITION TAPE TO CORRECT BLOCK NUMBER.
;RBLK SEARCHES FOR THE BLOCK IN BLKNO, ENTERS IT GOING FORWARD,
;AND THEN READS INTO CORE, DUMPS CORE, OR COMPARES CORE AS
;DETERMINED BY CONTENTS OF WRITE.
RBLK: HRRO C,TAPENO ;CURRENT TAPE NO.
;SET LH TO PREPARE FOR JUMPN IN DELE
SETOB A,B ;GO FORWARD, SET DC FOR SEARCH
CONSZ UTS,40 ;IS CHECKSUM BEING WRITTEN?
JRST .-1 ;WAIT
RB1: TRNN B,400001 ;DECIDE WHETHER TO TURN AROUND
TRCA C,10000 ;CHANGE DIRECTION AND DELAY
CONSO UTC,200000 ;UNIT SELECTED?
TRO C,2000 ;INVOKE STARTUP DELAY
RBG: CONO UTC,220200(C) ;COMMAND TO THE 551.
;200=SEARCH, 300=READ, 700=WRITE.
CONO DC,4011(A) ;COMMAND TO THE 136.
UWAIT1: CONSZ UTS,6 ;ANY ERRORS?
JRST ERR ;YES. GO DING AND THEN TYI
CONSO DC,1000 ;DATA READY?
JRST .-3 ;NO. WAIT SOME MORE
JUMPL E,INOUT(WRITE) ;IF IN MIDST OF A DT BLOCK, DISPATCH
DATAI DC,B ;NO. SEARCHING. GET BLOCK NUMBER
TRZ C,2000 ;DONT DELAY ANY MORE
SUBI B,(BLKNO) ;COMPARE WITH DESIRED BLOCK
TRNE C,10000 ;COMPLEMENT IF GOING REVERSE
TRC B,-2 ;BIT 35 IS FOR TURNAROUND SPACE.
JUMPN B,RB1 ;JUMP IF NOT GOING FORWARD INTO (BLKNO)
MOVNI E,200 ;WORDS PER BLOCK
MOVEM P,F ;SAVE RETURN IN AC0
TRO C,100 ;READ COMMAND, MAYBE
JUMPLE WRITE,RB2 ;JUMP IF READ
TRO C,400 ;CHANGE TO WRITE COMMAND
MOVNI A,401 ;SET 136 TO OUTPUT
JUMPG CT,.+3
HRRZS LINK ;IF LAST BLK, KILL LINK
DPB E,PNTR ;AND THE DIR BYTE ← 0
RB2: CAIE BLKNO,↑D100 ;IF NOT DIRECTORY BLOCK
MOVEI P,.+2 ;SETUP NEW RETURN
JRST RBG
AOJ E,LINK ;IN/OUTPUT LINK
JRA P,UWAIT1 ;RESTORE CALLER ADR AND PROCESS DATA WORDS
DATAI DC,@(P) ;READ COMMANDS. GET WORD TO CORE
INOUT: JRST UWAIT2 ;INOUT-1 THRU INOUT+1 ARE DISPATCHED TO.
DATAO DC,@(P) ;OUTPUT TO TAPE
UWAIT2: JRST 0(P) ;RETURN TO CALLER OF UWAIT OR RBLK.
ALTMD: MOVEI A,"$"
JSP P,TYO ;ALTMODE IS PRINTED AS "$"
CAIE CH,"K"-40 ;FOR K, WRITE := 0
CAIN CH,"D"-40 ;FOR D, WRITE :=1
AOJLE WRITE,.-1 ;COUNT (WRITE)
CAIN CH,"G"-40 ;GO TO PROGRAM?
JRST @SADR ;YES. JUMP OUT
CAIN CH,"F"-40 ;FILE DIR PRINT?
JRST FDIR ;YES. PRINT FILE DIR OF THIS TAPE
CAIN CH,"Z"-40 ;ZERO DIRECTORY?
JRST ZDIR ;DISPATCH
CAILE CH,27 ;SKIP IF OCTAL NUMBER
JRST TYI ;NO. GO PROCESS FILE NAME
LSH B,3 ;CONVERT SIXBIT TO OCTAL
LSHC F,3 ;F+1=B
JUMPN B,.-2 ;MAY BE MORE THAN 1 DIGIT (START ADR)
CAILE F,7 ;SKIP IF ONE DIGIT
JRA D,JBLK ;D:=SADR. DISPATCH TO JBLK WHICH SAVES SADR.
LSH F,3 ;SHIFT UNIT NUMBER LEFT FOR CONO
HRRM F,TAPENO ;SAVE IN CORE
CLSTP: MOVEI BLKNO,↑D100 ;BLK NO OF FILE DIR
SETZI PNTR,0 ;DONT CLOBBER DIRECTORY BYTE
JSP P,RBLK ;MOVE TO BLOCK 100
JFCL TAB+200(E) ;READ OR WRITE DIR TAB AS PER "WRITE"
AOJL E,UWAIT1 ;COUNT THE 200 WORDS
JRST BEG ;GO ASK FOR NEXT COMMAND
ZDIR: MOVE A,[XWD FOOF,TAB] ;FOOF IS CLEAR
BLT A,TAB+176 ;CLEAR DIRECTORY, EXCEPT LAST WORD FOR ID
MOVSI A,(36B4+36B9) ;RESERVE BLOCKS 1 & 2
MOVEM A,TAB ;IN DIRECTORY
MOVSI A,(36B9)
MOVEM A,TAB+16 ;BLK 100 (DIR) IS RESERVED TOO
HRLOI A,7 ;AND BLOCKS >1100 ARE EOT
MOVEM A,TAB+122 ;END OF BYTE TAB
AOJA WRITE,CLS1 ;SET WRITE TO OUTPUT AND DUMP BLK 100.
FDIR: MOVNI FILN,26 ;26 FILES (OCTAL)
FD2: JSP P,CRR ;CR-LF
SKIPN C,TAB+123+26(FILN) ;FIRST WORD OF NAME. IS IT BLANK?
AOJA C,FD1 ;YES. SET C=1 AND LOOP
JSP G,SIXBP ;PRINT FIRST WORD AND A SPACE
HLLZ C,TAB+151+26(FILN) ;SECOND WORD OF FILE NAME
JSP G,SIXBP ;PRINT AND CLEAR C
FD1: AOJL FILN,FD2(C) ;CAN JUMP TO FD2 OR FD2+1. COUNT FILES.
JRST BEG ;ALL FILES PRINTED OR BLANK. RETURN.
SIXBP: MOVEI B,7 ;PRINT C IN SIXBIT AND ADD A SPACE
;LEAVES (C)=0!
TAPENO: ;USE ADR AS TEMP FOR CURRENT UNIT
SIXBP1: SETZI A,.-. ;CLEAR A
LSHC A,6
ADDI A,40 ;SIXBIT TO ASCII
JSP P,TYO ;TYPE OUT CHARACTER
SOJG B,SIXBP1 ;LOOP IF MORE CHARACTERS
JRST 0(G) ;RETURN
SPNT: 0 ;POINTER TO HEADERS IN CORE.
LIT
SLOP=COMPTR-17-. ;THIS MANY WORDS BEFORE RESERVED AREA
;FOR COMMAND STRINGS.
;!!!!! NOTE: ABOVE PARAMETER MUST COME OUT POSITIVE IN
; ORDER TO MEET THE DOCUMENTATION OF RESERVED COMMAND STRING AREA.
;
; THIS MEANS ANY CODE ADDED MUST BE COMPENSATED FOR BY
; A CORRESPONDING TIGHTENING SOMEWHERE. GOOD LUCK.
; TENDMP IS VERY TIGHT ALREADY.
END BEGR